<!--
 * @Description:
 * @Version: 2.0
 * @Autor: ycw
 * @Date: 2022-01-07 16:20:44
 * @LastEditors: ycw
 * @LastEditTime: 2022-01-07 18:07:28
-->
<!-- @author zhengjie -->
<template>
  <div class="icon-body">
    <el-input
      v-model="name"
      style="position: relative;"
      clearable
      placeholder="请输入图标名称"
      @clear="filterIcons"
      @input.enter="filterIcons"
    >
      <template #suffix>
        <i class="el-icon-search el-input__icon" />
      </template>
    </el-input>
    <div class="icon-list">
      <div
        v-for="(item, index) in iconList"
        :key="index"
        @click="selectedIcon(item)"
      >
        <svg-icon
          :icon-class="item"
          style="height: 30px;width: 16px;"
        />
        <span>{{ item }}</span>
      </div>
    </div>
  </div>
</template>

<script>
import { defineComponent, reactive, toRefs } from '@vue/runtime-core'
import icons from './requireIcons'
export default defineComponent({
  name: 'IconSelect',
  emits: ['selected'],
  setup(props, ctx) {
    const state = reactive({
      iconList: icons,
      name: ''
    })

    const filterIcons = () => {
      state.iconList = icons
      if (state.name) {
        state.iconList = state.iconList.filter(item => item.includes(state.name))
      }
    }
    const selectedIcon = (name) => {
      ctx.emit('selected', name)
      document.body.click()
    }
    const reset = () => {
      state.name = ''
      state.iconList = icons
    }
    return {
      ...toRefs(state),
      filterIcons,
      selectedIcon,
      reset
    }
  }
})
</script>

<style rel="stylesheet/scss" lang="scss" scoped>
  .icon-body {
    width: 100%;
    padding: 10px;
    .icon-list {
      height: 200px;
      overflow-y: scroll;
      div {
        height: 30px;
        line-height: 30px;
        margin-bottom: -5px;
        cursor: pointer;
        width: 33%;
        float: left;
      }
      span {
        display: inline-block;
        vertical-align: -0.15em;
        fill: currentColor;
        overflow: hidden;
      }
    }
  }
</style>
